import cv2
import numpy as np

# 读取图片
img = cv2.imread('poker.jpg')

# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 加载模板
#gray[75:105,235:265]是一个二维数组，代表一个角点的坐标。
template = gray[75:105,235:265]
#匹配模板
#gray是原图
#template是模板
#TM_CCOEFF_NORMED是匹配方法
#cv2.TM_CCOEFF_NORMED是标准相关系数匹配方法
#res是匹配结果，其中每一个元素都是一个浮点数，代表一个角点的匹配程度。
res = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
#0.9是一个阈值，代表匹配的程度。
#res >= 0.9是一个布尔数组，其中每个元素都是一个布尔值
#np.where(res >= 0.9)是一个函数，返回的是一个二维数组，其中每个元素都是一个二维数组，代表一个角点的坐标。
#np是numpy库的别名
locations = np.where(res >= 0.9)

w, h = template.shape[0:2]#获取模板的宽度和高度
#遍历locations中的每个元素，每个元素都是一个二维数组，代表一个角点的坐标。
#zip(*locations[::-1])是一个函数，返回的是一个二维数组，其中每个元素都是一个二维数组，代表一个角点的坐标。
#::-1是一个切片，代表从后往前切片。-1是步长
#前加*是一个解包操作，代表将locations中的每个元素解包成一个二维数组，然后再将这些二维数组解包成一个二维数组。
for pt in zip(*locations[::-1]):
    x1, y1 = pt[0], pt[1]#获取角点的坐标
    x2, y2 = x1 + w, y1 + h#计算角点的坐标
    #(x1, y1)是左上角的坐标，(x2, y2)是右下角的坐标，(0, 255, 0)是颜色，2是线宽。
    #绘制矩形框
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
   
#显示图片
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()